package cn.puge.usercenter.config;

import cn.puge.usercenter.shiro.realms.CustomerRealm;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * @author LIJW
 * @date 2020/9/4 19:36
 * 用来整合shiro框架相关的配置类
 */
@Configuration
public class ShiroConfig {


   //1.创建shiroFilter  负责拦截所有请求
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager){
        //创建shiro的filter
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
          //注入安全管理器  给filter设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);

        //配置系统受限资源
        //配置系统公共资源
//        Map<String,String> map = new HashMap<>();
//        map.put("/user/login","anon");//anon 设置公共资源 要放在上面
//        map.put("/user/register","anon");//anon 设置为公共资源  放行资源放在下面
//        map.put("/register.jsp","anon");//anon 设置公共资源 要放在上面
//        map.put("/**","authc");  //authc  请求这个资源需要认证和授权
//        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);

//        //设置认证界面路径  默认路径为login
//        shiroFilterFactoryBean.setLoginUrl("/login.jsp");
        return shiroFilterFactoryBean;
    }

    //2.创建安全管理器  web管理器
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(Realm realm){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        //给安全管理器设置
        defaultWebSecurityManager.setRealm(realm);

        return defaultWebSecurityManager;
    }

    //3.创建自定义realm
    @Bean
    public Realm getRealm(){

        CustomerRealm customerRealm = new CustomerRealm();
        //修改凭证校验匹配器
        HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
        //设置加密算法为md5
        credentialsMatcher.setHashAlgorithmName("MD5");
        //设置散列次数
        credentialsMatcher.setHashIterations(1024);
        customerRealm.setCredentialsMatcher(credentialsMatcher);


        //开启缓存管理器
//        customerRealm.setCacheManager(new RedisCacheManager());
//        customerRealm.setCachingEnabled(true);//开启全局缓存
//        customerRealm.setAuthenticationCachingEnabled(true);//认证缓存
//        customerRealm.setAuthenticationCacheName("UserLoginToken");
//        customerRealm.setAuthorizationCachingEnabled(true);//开启授权缓存
//        customerRealm.setAuthorizationCacheName("UserInfo");
        return customerRealm;
    }


}
